/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 邓大帅
 * Date: 2024-01-10
 * Time: 17:12
 */
//多态的三个条件 1.继承 2.向上转型 3.重写
//    重写： 1.方法名称相同 2.返回值相同 3.参数列表相同 (协变类型:返回值不同的重写,父类方法的返回值是子类重写方法返回值的父亲)
//    动态绑定： 1.重写 2.向上转型 3.通过父类引用调用父类和子类同名的方法
//    静态绑定：例如重载 在编译过程中就知道要调用哪个方法了
//    多态：当父类引用的对象不一样时，表现出的行为是不一样的
class Animal1 {
    public String name;
    public int age;
//    private修饰的方法是不能被重写的 static修饰的方法是不能被重写的 final修饰的方法也是不能重写的
//    子类重写父类方法时的访问修饰限定符权限要大于等于父类方法的权限
    public void eat() {
        System.out.println(this.name + " 正在吃饭！ ");
    }
}

class Dog1 extends Animal1 {
    public void wangWang() {
        System.out.println(this.name + " 汪汪叫");
    }

    @Override
    public void eat() {
        System.out.println(this.name + " 正在吃狗粮");
    }
}

class Cat1 extends Animal1 {
    @Override
    public void eat() {
        System.out.println(this.name + " 正在吃猫粮");
    }

    public void miaoMiao() {
        System.out.println(this.name + " 喵喵叫");
    }
}

public class Test5 {
    public static void main(String[] args) {
//      向下转型 用的很少且不安全
        Animal1 animal1 = new Dog1();
        Dog1 dog1 = (Dog1) animal1;//不报错，因为原本就是狗对象的引用，这里只是强转回它原本的引用
        System.out.println("========");
//        加入判断语句
        if (animal1 instanceof Cat1) {//该判断语句用来判断animal是否引用的是猫对象,可以使得向下转换安全进行
            Cat1 cat1 = (Cat1) animal1;//运行会出错，因为最根本来看这个引用是一个狗对象的引用，强制转换成猫对象引用会报错
        }
    }
    public static void main1(String[] args) {
//        这里发生了向上转型
        Animal1 animal1 = new Dog1();
//        向上转型后只能通过父类的引用访问父类自己的成员，不能访问到子类特有的成员
        animal1.name = "十二月";
//        在方法的传参和返回值部分都可以发生向上转型
    }
}
//注意:在父类的构造方法当中去调用父类和子类的重写方法的时候,此时会调用子类的 以后不要这样写代码
